import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
/**
 * den her klasse er hoved klassen for vores spil "Nøglen til æsken".
 * Nøglen til æsken er et meget simpelt tekst baseret spil.
 * Brugerne kan gå rundt i et hus og søge forskellige ting i,
 * de forskellige rum for at finde en nøgle til en æske.
 * 
 * den her klasse laver alle rummene og laver parser og starter spillet.
*
* @author  Morten Jakob Danny
* @version 01-11-2012
*/
 
public class Game
{
    private Parser parser;
    private Room currentRoom;
    private ArrayList taske;
    Room stue, kontor, koekken, sovevaerelse, trappe, badevaerelse, have, repos, vaerelse, boernevaerelse;

    
       
    /**
     * Laver spillet og laver huset.
     */
    public Game()
    {
        taske = new ArrayList();
        createRooms();
        parser = new Parser();
        createItems();
        createExits();
    }
 
    /**
     * laver alle rummene og sætter deres udgange.
     */
    private void createRooms()
    {
        // create the rooms
        stue = new Room("i stuen.");
        have = new Room("i haven. Her kan du lede i enten skuret, krukkerne eller ved havemoeblerne");
        koekken = new Room("i koekkenet. Her kan du lede på koekkenbordet, i koekkenskufferne, i komfuret eller i koeleskabet");
        sovevaerelse = new Room("i sovevaerelset. Her kan du lede i sengen, på bordet eller i klaedeskabet");
        badevaerelse = new Room("på badevaerelset. Her kan du lede på hyldenerne, i medicinskabet eller imellem haandklaederne");
        kontor = new Room("på kontoret. Her kan du lede i skrivebordet, i skraldespanden eller på reolen");
        trappe = new Room("på trappen. Her kan du lede på trinene eller under trappen");
        repos = new Room("på 1. sals repos. Her kan du lede i vitrineskabet, i sofaen eller på hylden");
        vaerelse = new Room("på vaerelset. Her kan du lede i reolen, imellem boegerne eller på stolen");
        boernevaerelse = new Room("på boernevaerelset. Her kan du lede i legetoejet, i klaedeskabet eller i boernesengen");
       
        currentRoom = stue;  // start spillet i stuen
                
        
    }
    
    /**
     * create exits
     */
    public void createExits()
    {
                // udgange (nord, oest, syd, vest)
        stue.setExit("nord", kontor);
        stue.setExit("oest", sovevaerelse);
        stue.setExit("syd", koekken);
        stue.setExit("vest", have);
        
        koekken.setExit("nord", stue);
        
        have.setExit("oest", stue);
        
        sovevaerelse.setExit("vest", stue);
        sovevaerelse.setExit("syd", badevaerelse);
        
        kontor.setExit("syd", stue);
        kontor.setExit("oest", trappe);
        
        trappe.setExit("nord", repos);
        trappe.setExit("vest", kontor);
        
        repos.setExit("nord", vaerelse);
        repos.setExit("vest", boernevaerelse);
        repos.setExit("syd", trappe);
        
        vaerelse.setExit("syd", repos);
        
        boernevaerelse.setExit("oest", repos);
    }
    
    /**
     * create items
     */
    public void createItems()
    {
        // ting du har på dig
        taske.add(new Item("Aeske"));
        
        // Ting der er i have
        have.addItem(new Item("skuret", 1));
        have.addItem(new Item("krukkerne", 2));
        have.addItem(new Item("havemoeblerne", 3));
        
        // ting der er i koekken
        koekken.addItem(new Item("koekkenbordet", 4));
        koekken.addItem(new Item("koekkenskufferne", 5));
        koekken.addItem(new Item("komfuret", 6));
        koekken.addItem(new Item("koeleskabet", 7));
        
        // ting der er i sovevaerlse
        sovevaerelse.addItem(new Item("sengen", 8));
        sovevaerelse.addItem(new Item("bordet", 9));
        sovevaerelse.addItem(new Item("klaedeskabet", 10));
        
        // ting der er i badevaerelse
        badevaerelse.addItem(new Item("hylder", 11));
        badevaerelse.addItem(new Item("medicinskabet", 12));
        badevaerelse.addItem(new Item("haandklaederne", 13));
        
        // ting der er i kontor
        kontor.addItem(new Item("skrivebordet", 14));
        kontor.addItem(new Item("skraldespanden", 15));
        kontor.addItem(new Item("reolen", 16));
        
        // ting der er i trappe
        trappe.addItem(new Item("trinene", 17));
        trappe.addItem(new Item("under trappen", 18));
       
        // ting der er i repos
        repos.addItem(new Item("vitrineskabet", 19));
        repos.addItem(new Item("sofaen", 20));
        repos.addItem(new Item("hylden", 21));
        
        // ting der er i vaerelse
        vaerelse.addItem(new Item("reolen", 22));
        vaerelse.addItem(new Item("boegerne", 23));
        vaerelse.addItem(new Item("stolen", 24));
        
        // ting der er i boernevaerelset
        boernevaerelse.addItem(new Item("legetoejet", 25));
        boernevaerelse.addItem(new Item("klaedeskabet", 26));
        boernevaerelse.addItem(new Item("boernesengen", 27));
        
    }
 
    /**
     * Spillets routine der kører indtil spillets slut.
     */
    public void play()
    {           
        printWelcome();
 
 
        // Enter the main command loop.  Here we repeatedly read commands and
        // execute them until the game is over.
               
        boolean finished = false;
        while (! finished) {
            Command command = parser.getCommand();
            finished = processCommand(command);
        }
        System.out.println("Tak fordi du gad at spille farvel");
    }
 
 
    /**
     * Printer velkomst besked for spilleren.
     */
    private void printWelcome()
    {
        System.out.println();
        System.out.println("Velkommen til Nøglen Til Æsken!");
        System.out.println("Nøglen til Æsken er et nyt spændende tekst baseret spil.");
        System.out.println("Hvis du har brug for hjælp skriv hjaelp");
        System.out.println("Du har følgende kommandoer gaa , hjaelp , afslut, tag , soeg");
        System.out.println("eks: gaa syd");
        System.out.println();
        System.out.println(currentRoom.getLongDescription());
    }
 
 
    /**
     * Givende kommandoer til spillet der blir eksekvere i "command".
     */
    private boolean processCommand(Command command)
    {
        boolean wantToQuit = false;
 
 
        if(command.isUnknown()) {
            System.out.println("Jeg ved ikke hvad du mener...");
            return false;
        }
 
 
        String commandWord = command.getCommandWord();
        if (commandWord.equals("hjaelp")) {
            printHelp();
        }
        else if (commandWord.equals("gaa")) {
            goRoom(command);
        }
        else if (commandWord.equals("afslut")) {
            wantToQuit = quit(command);
        }
        else if (commandWord.equals("tag"))
            doTake(command);
        else if (commandWord.equals("soeg"))
            doSerach(command);
            return wantToQuit;
        }
        
   /**
     * doTake
     */
    public void doTake(Command command) 
    {
        System.out.println("Gør ikke noget endnu.");
    }
   
  
 
    // implementations of user commands:
 
 
    /**
     * Printer nogle hjælpe infomationer.
     * her printer vi nogle beskeder og en liste
     * af kommando ord.
     */
    private void printHelp()
    {
        System.out.println("Du er forvirret og har brug for hjælp");
        System.out.println("Din opgave er at finde en nøgle");
        System.out.println("Til at åbne din æske");
        System.out.println();
        System.out.println("Du har følgende kommando muligheder:");
        parser.showCommands();
    }
    
    public void printKeyFound()
    {
        System.out.println(" Du har fundet nøglen flot klaret");
    }
    
    public void printKeyNotFound()
    {
        System.out.println(" der var ingenting søg videre");
    }
 
 
    /** 
     * Hvis du går i en retning. Hvis der er en udgang gå igennem til nyt rum,
     * ellers print en fejlmelding.
     */
    private void goRoom(Command command) 
    {
        if(!command.hasSecondWord()) {
            // if there is no second word, we don't know where to go...
            System.out.println("Gaa Hvor?");
            return;
        }

        String direction = command.getSecondWord();

        // Try to leave current room.
        Room nextRoom = currentRoom.getExit(direction);

        if (nextRoom == null) {
            System.out.println("Der er ingen dør!");
        }
        else {
            currentRoom = nextRoom;
            System.out.println(currentRoom.getLongDescription());
        }
    }
 
 
    /**
     * "Afslut" er skrevet. Check resten af kommandoer
     * om han virkelig vil afslutte spillet.
     * returner true hvis kommandoen afslutter spiller, ellers false.
     */
    private boolean quit(Command command)
    {
        if(command.hasSecondWord()) {
            System.out.println("Afslut Hvad?");
            return false;
        }
        else {
            return true;  // signal that we want to quit
        }
    }
    

}